###################################################### Настройка ssl-сертификатов на компонентах ServiceGate ###################################################### Сервисы ServiceGate для хранения сертификатов и ключей SSL используют специальное хранилище в формате Java Keystore (далее JKS). Для работы с JKS необходима утилита keytool, которая идет в комплекте с Java JDK. Ниже будут описаны настройки Sgate, которые необходимо сделать для работы SSL, а также примеры формирования хранилища JKS. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Описание настроек SSL, которые хранятся в Vault ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ В Vault хранятся следующие настройки SSL: *sgate/common/ssl.enabled* Включает/выключает поддержку SSL сервисом (true или false). *ssl.store-path* Путь к хранилищу ключей SSL в контейнере. Путь, по которому сервис будет выполнять поиск файла keystore.jks относительно своего classpath (если запускается сервис в контейнере, то в classpath по умолчанию входит /app/resources, /app/classes, /app/libs/). *sgate/common/ssl.store-pass* Пароль к хранилищу ключей SSL (пароль на хранилище keystore). *sgate/common/ssl.key-pass* Пароль к ключу в хранилище (пароль на закрытый ключ). .. note:: Существует список общих настроек SSL, которые хранятся в Vault. Но есть возможность указать те же настройки SSL и для каждого сервиса отдельно. В этом случае приоритет у последних будет выше. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Пример генерации параметра "keystore" с самоподписанным сертификатом ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Параметры "keystore" и "keypass" задают пароли на хранилище и закрытый ключ. Эти параметры необходимо указать в Vault соответственно по путям sgate/common/ssl.store-pass и sgate/common/ssl.key-pass: :: keytool -genkey -dname "cn=sgate-test.igtel.ru, ou=dev, o=IGTEL, c=RU" -alias sgate-dev -keypass 123456 -keystore ./keystore.jks -storepass 123456 -validity 3650 -keyalg RSA -ext SAN=dns:sgate-test.igtel.ru ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Пример создания параметра "keystore" на основе существующей цепочки сертфикатов и закрытого ключа ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Для создания параметра "keystore" на основе существующей цепочки сертфикатов и закрытого ключа необходимо выполнить следующее: 1. Создать хранилище PFX (PKCS#12): :: openssl pkcs12 -export -in cert-chain.pem -inkey private.key -name sgate-test.igtel.ru -out sgate-test.igtel.ru.pfx 2. Создать новый Java keystore в формате JKS и импортируем туда PFX: :: keytool -importkeystore -destkeystore keystore.jks -srckeystore sgate-test.igtel.ru.pfx -srcstoretype PKCS12 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Настройка SSL в сервисах ServiceGate ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Настройка SSL в сервисе бэкенда выполняется одним из двух способов: 1. В случае если используется заранее подготовленный образ виртуальной машины ServiceGate, то достаточно положить готовый keystore внутри виртуальной машины по пути /home/sgate/sgate-docker/volumes/ssl/keystore.jks. В данном случае всеми сервисами будет использован общий файл keystore.jks. Для того, чтобы сервис задействовал SSL необходим включенный параметр ssl.enabled (см. `Описание настроек SSL, которые хранятся в Vault`_). При обновлении файла JKS потребуется перезапуск сервисов. 2. В случае если используется самостоятельное разворачивание контейнера в собственной среде Docker, то необходимо обеспечить наличие хранилища JKS внутри контейнера относительно classpath приложения (как правило, достаточно положить в /app/resources контейнера). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Настройка SSL в сервисе UI (фронтенда) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Контейнер с UI поставляется с Nginx. Если необходимо включить SSL на уровне контейнера с UI, то следует руководствоваться соответствующуей документацией по настройке на официальном сайте Nginx (https://nginx.org/). Если используется заранее подготовленный образ виртуальной машины ServiceGate, то настройки Nginx находятся внутри виртуальной машины по пути /home/sgate/sgate-docker/volumes/sgate-ui/nginx. Затем, после сделанных настроек внутри виртуальной машины ServiceGate для Nginx, можно отправить сигнал процессу Nginx на перезапуск конфигурации командой: :: docker exec sgate-docker_ui_1 nginx -s reload. ~~~~~~~~~~~~~~~~~~~~~~~~ Настройка SSL для Vault ~~~~~~~~~~~~~~~~~~~~~~~~ В данном разделе описываются необходимые настройки для доступа к Vault по протоколу HTTPS, но не настройки аутентификации через SSL/TLS. В случае если используется заранее подготовленный образ виртуальной машины ServiceGate, то необходимо настроить tls listener по пути /etc/vault/config.hcl: :: listener "tcp" { address = "0.0.0.0:8200" tls_disable = 0 tls_cert_file = "/etc/certs/vault.crt" tls_key_file = "/etc/certs/vault.key" } Здесь tls_disable = 0 включает SSL, tls_cert_file и tls_key_file указывают на пути к файлам сертификата и закрытого ключа. Это минимальные настройки внутри файла config.hcl для включения HTTPS, см. дополнительную информацию по настройке Vault по ссылке https://www.vaultproject.io/docs/configuration/listener/tcp. Далее необходимо прописать HTTPS для переменной VAULT_ADDR в файле /home/sgate/.bash_profile (необходимо для консольного подключения к Vault и для сервиса vault-auto-unseal): :: VAULT_ADDR="https://127.0.0.1:8200" Контейнеры с сервисами используют HTTP API для аутентификации через token. Для того, чтобы они подключались к Vault по протоколу HTTPS необходимо в файле /home/sgate/sgate-docker/.env скорректировать URL: :: VAULT_URL=https://sgate-test.igtel.ru:8200 Затем необходимо перезапустить контейнеры встроенной командой sgate-ctl stopall / sgate-ctl startall (команды находятся в процессе разработки, синтаксис может измениться в будущем): :: [sgate@sgate-test scripts]$ sgate-ctl stopall Stopping sgate-docker_ui_1 ... Stopping sgate-docker_ui_1 ... done Stopping sgate-docker_integration-solr_1 ... done Stopping sgate-docker_integration-db_1 ... done Stopping sgate-docker_integration-ldap_1 ... done [sgate@sgate-test scripts]$ sgate-ctl startall Starting backend ... done Starting integration-db ... done Starting integration-ldap ... done Starting integration-solr ... done Starting ui ... done .. note:: Если для Vault используется самоподписанный сертификат или сертификат подписанный удостоверяющим центром предприятия, то может потребоваться правка файла cacerts на уровне JDK контейнеров. В файле cacerts содержатся сертификаты УЦ. Пример команды для подключения собственного файла сертификата УЦ: :: keytool -import -alias new-cert -keystore /opt/openjdk-14/lib/security/cacerts -storepass changeit -file ca.pem Далее измененный cacerts необходимо добавить внутрь контейнеров сервисов по пути /opt/openjdk-14/lib/security/cacerts (в дальнейшем путь может измениться при переходе на другие версии JDK).